package main

import (
	"fmt"
	mapset "github.com/deckarep/golang-set"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
	"os"
	"time"
)

type UserModel struct {
	gorm.Model
	Name     string
	Password string
	Birthday time.Time
	Desc     string
	Status   int
}

// TableName 解决gorm表明映射
//func (UserModel) TableName() string {
//	return "user_model"
//}

/*
*
* https://blog.csdn.net/niwoxiangyu/article/details/129877008
* https://www.cnblogs.com/zly-go/p/15472054.html
* https://blog.csdn.net/weixin_42475906/article/details/131719787
 */
func main() {
	setDemo()
	// 获取数据库连接
	db, err := gorm.Open("mysql", "root:root@tcp(127.0.0.1:3306)/gen?charset=utf8mb4&parseTime=true&loc=PRC")
	db.SingularTable(true)
	if err != nil {
		fmt.Println("Open fail", err.Error())
		os.Exit(-1)
	}
	// 延迟关闭数据库连接
	defer func(db *gorm.DB) {
		err := db.Close()
		if err != nil {
			fmt.Println("Close fail", err.Error())
		}
	}(db)
	db.LogMode(true)
	// 自动迁移数据库
	db.AutoMigrate(&UserModel{})

	// 插入数据
	for i := 0; i < 10; i++ {
		db.Create(&UserModel{Name: fmt.Sprintf("wu_%d", i), Password: "123!@#"})
	}

	// 按主键获取数据
	var u UserModel
	db.First(&u, 1)
	fmt.Println(u)

	// 按条件获取数据
	var u2 UserModel
	db.First(&u2, "name = ?", "wu_7")
	fmt.Println(u2)

	// 更新数据
	db.Model(u2).Update("password", "!@#QWE")
	fmt.Println(u2)

	// 删除数据
	db.Delete(&u2)
	fmt.Println(u2)

	var qUser UserModel
	result := db.Raw("select * from user_model where id=?", 5).Scan(&qUser)
	if result.Error != nil {
		panic(result.Error)
	}
	fmt.Println(qUser)

	var qUsers []UserModel
	result2 := db.Raw("select * from user_model limit 5").Scan(&qUsers)
	if result2.Error != nil {
		panic(result.Error)
	}
	fmt.Println(qUsers)
}

func setDemo() {
	// 默认创建的线程安全的，如果无需线程安全
	// 可以使用 NewThreadUnsafeSet 创建，使用方法都是一样的。
	s1 := mapset.NewSet(1, 2, 3, 4)
	fmt.Println("s1 contains 3: ", s1.Contains(3))
	fmt.Println("s1 contains 5: ", s1.Contains(5))
	// interface 参数，可以传递任意类型
	s1.Add("poloxue")
	fmt.Println("s1 contains poloxue: ", s1.Contains("poloxue"))
	s1.Remove(3)
	fmt.Println("s1 contains 3: ", s1.Contains(3))
	s2 := mapset.NewSet(1, 3, 4, 5)
	// 并集
	fmt.Println(s1.Union(s2))
}
